package pe.edu.unmsm.fisi.sisconteg.view.controller.procesos;

import java.io.IOException;
import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.event.SelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import pe.edu.unmsm.fisi.sisconteg.business.service.CertificadoService;
import pe.edu.unmsm.fisi.sisconteg.business.service.EgresadoCertificadoService;
import pe.edu.unmsm.fisi.sisconteg.business.service.EgresadoService;
import pe.edu.unmsm.fisi.sisconteg.business.service.EmpresaService;
import pe.edu.unmsm.fisi.sisconteg.business.service.ExperienciaLaboralService;
import pe.edu.unmsm.fisi.sisconteg.business.service.GradoTesisService;
import pe.edu.unmsm.fisi.sisconteg.business.service.OtroEstudioService;
import pe.edu.unmsm.fisi.sisconteg.business.service.TesisService;
import pe.edu.unmsm.fisi.sisconteg.domain.model.Certificado;
import pe.edu.unmsm.fisi.sisconteg.domain.model.Egresado;
import pe.edu.unmsm.fisi.sisconteg.domain.model.EgresadoCertificado;
import pe.edu.unmsm.fisi.sisconteg.domain.model.Empresa;
import pe.edu.unmsm.fisi.sisconteg.domain.model.ExperienciaLaboral;
import pe.edu.unmsm.fisi.sisconteg.domain.model.GradoTesis;
import pe.edu.unmsm.fisi.sisconteg.domain.model.OtroEstudio;
import pe.edu.unmsm.fisi.sisconteg.domain.model.Tesis;
import pe.edu.unmsm.fisi.sisconteg.domain.model.Usuario;
import pe.edu.unmsm.fisi.sisconteg.util.UtilsSisconteg;

@ManagedBean
@Scope("view")
@Controller
public class EgresadoController implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/***************** ATRIBUTOS **************/
	private Egresado egresado;
	private Egresado egresadoSeleccionado;
	private List<Egresado> listEgresados;

	private EgresadoCertificado egreCertificadoEditar;
	private EgresadoCertificado egreCertificadoSeleccionado;
	private List<Certificado> listCertificados;
	private List<GradoTesis> listGradoTesis;

	private ExperienciaLaboral experienciaLabEditar;
	private ExperienciaLaboral experienciaLabSeleccionado;
	private List<Empresa> listEmpresas;

	private OtroEstudio otroEstudioEditar;
	private OtroEstudio otroEstudioSeleccionado;

	private Tesis tesisEditar;
	private Tesis tesisSeleccionado;
	
	private Usuario usuLogueado;
	
	private int gradoTesis;
	private Empresa empresa;

	@Autowired
	private ExperienciaLaboralService experienciaLaboralService;

	@Autowired
	private EgresadoService egresadoService;

	@Autowired
	private EmpresaService empresaService;

	@Autowired
	private OtroEstudioService otroEstudioService;

	@Autowired
	private CertificadoService certificadoService;
	
	@Autowired
	private EgresadoCertificadoService egresadoCertificadoService;
	
	@Autowired
	private TesisService tesisService;

	@Autowired
	private GradoTesisService gradoTesisService;
	
	/***************** INICIALIZACION **************/
	public EgresadoController() {
		setExperienciaLabEditar(new ExperienciaLaboral());
		otroEstudioEditar = new OtroEstudio();
		egreCertificadoEditar = new EgresadoCertificado();
		tesisEditar = new Tesis();
		setEmpresa(new Empresa());
	}

	@PostConstruct
	public void init() {
		setUsuLogueado((Usuario) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("usuarioLogueado"));

		if (getUsuLogueado() != null && getUsuLogueado().getPerfil().equals(UtilsSisconteg.ROL_EGRESADO)) {
			setEgresado(getUsuLogueado().getEgresado());
			System.out.println("Egresado obtenido");
			setListEmpresas(empresaService.listarEmpresas());
			listCertificados = certificadoService.listCertificados();
		}
		listEgresados = egresadoService.listarEgresados();
		listGradoTesis = gradoTesisService.getListGradosTesis();
		System.out.println();
	}
	
	/******************* LISTENERS ********************/
	public void cargarEgresado(SelectEvent evt) {
		setEgresado(egresadoService.getEgresadoxId(getEgresadoSeleccionado().getIdEgresado()));
		listEmpresas = empresaService.listarEmpresas();
		listCertificados = certificadoService.listCertificados();
		FacesMessage msg = new FacesMessage("Egresado Seleccionado",
				getEgresado().getAlumno().getNombres());
		FacesContext.getCurrentInstance().addMessage(null, msg);

	}
	
	public void limpiarDialgoEmp(ActionEvent ev){
		setEmpresa(new Empresa());
	}

	/******************* NAVEGACION ******************/
	public String logoutAction() {
		ExternalContext context = FacesContext.getCurrentInstance()
				.getExternalContext();
		try {
			context.redirect(context.getRequestContextPath() + "/logout");
		} catch (IOException e) {
			e.printStackTrace();
		}

		context.invalidateSession();

		FacesContext.getCurrentInstance().responseComplete();
		return null;
	}

	/************************ REGISTROS **************************/

	public void guardarEmpresa(ActionEvent ev){
		try {
			empresaService.crearEmpresa(getEmpresa());
			setListEmpresas(empresaService.listarEmpresas());			
		} catch (Exception e) {
			e.printStackTrace();
		}

	} 
	
	public void guardarExperienciaLab(ActionEvent ev) {
		experienciaLabEditar.setEgresado(egresado);

		experienciaLaboralService.crearExperienciaLaboral(experienciaLabEditar,
				egresado);
		egresado = egresadoService.getEgresadoxId(egresado.getIdEgresado());
		
		FacesMessage msg = new FacesMessage("Exito",
				" La experiencia Laboral se guardo con Exito.");
		FacesContext.getCurrentInstance().addMessage(null, msg);
		
		experienciaLabEditar = new ExperienciaLaboral();
		guardarUsuarioSession();
	}

	public void guardarOtroEstudio(ActionEvent ev) {
		otroEstudioEditar.setEgresado(egresado);

		otroEstudioService.crearOtroEstudio(otroEstudioEditar, egresado);
		egresado = egresadoService.getEgresadoxId(egresado.getIdEgresado());

		FacesMessage msg = new FacesMessage("Exito",
				" Otro estudio se guardo con Exito.");
		FacesContext.getCurrentInstance().addMessage(null, msg);
		
		otroEstudioEditar = new OtroEstudio();
		guardarUsuarioSession();
	}
	
	public void guardarEgresadoCertificado(ActionEvent ev) {
		egreCertificadoEditar.setEgresado(egresado);
		
		egresadoCertificadoService.crearEgresadoCertificado(egreCertificadoEditar, egresado, egreCertificadoEditar.getCertificado());
		
		egresado = egresadoService.getEgresadoxId(egresado.getIdEgresado());
		FacesMessage msg = new FacesMessage("Exito",
				" El certificado se guardo con Exito.");
		FacesContext.getCurrentInstance().addMessage(null, msg);
		
		egreCertificadoEditar = new EgresadoCertificado();
		guardarUsuarioSession();
	}
	
	public void guardarTesis(ActionEvent ev) {
		tesisEditar.setEgresado(egresado);
		tesisEditar.setGradoTesis(gradoTesisService.getxId(gradoTesis));
		
		tesisService.crearTesis(tesisEditar, egresado);
		
		egresado = egresadoService.getEgresadoxId(egresado.getIdEgresado());
		
		String mensaje = String.format("La %s se guardo con éxito.", (tesisEditar.getFlagTesisTesina() == false)? "tesis" : "tesina");
		
		FacesMessage msg = new FacesMessage("Exito", mensaje);
		FacesContext.getCurrentInstance().addMessage(null, msg);
		
		tesisEditar = new Tesis();
		guardarUsuarioSession();
	}

	private void guardarUsuarioSession() {
		getUsuLogueado().setEgresado(egresado);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuarioLogueado", getUsuLogueado());
	}

	/***************** GETTERS AND SETTERS **************/
	public Egresado getEgresado() {
		return egresado;
	}

	public void setEgresado(Egresado egresado) {
		this.egresado = egresado;
	}

	public List<GradoTesis> getListGradoTesis() {
		return listGradoTesis;
	}
	
	public void setListGradoTesis(List<GradoTesis> listGradoTesis) {
		this.listGradoTesis = listGradoTesis;
	}
	
	public OtroEstudio getOtroEstudioEditar() {
		return otroEstudioEditar;
	}

	public void setOtroEstudioEditar(OtroEstudio otroEstudioEditar) {
		this.otroEstudioEditar = otroEstudioEditar;
	}

	public OtroEstudio getOtroEstudioSeleccionado() {
		return otroEstudioSeleccionado;
	}

	public void setOtroEstudioSeleccionado(OtroEstudio otroEstudioSeleccionado) {
		this.otroEstudioSeleccionado = otroEstudioSeleccionado;
	}

	public EgresadoCertificado getEgreCertificadoEditar() {
		return egreCertificadoEditar;
	}

	public void setEgreCertificadoEditar(EgresadoCertificado egresadoCertEditar) {
		this.egreCertificadoEditar = egresadoCertEditar;
	}

	public EgresadoCertificado getEgreCertificadoSeleccionado() {
		return egreCertificadoSeleccionado;
	}

	public void setEgreCertificadoSeleccionado(
			EgresadoCertificado egresadoCertSeleccionado) {
		this.egreCertificadoSeleccionado = egresadoCertSeleccionado;
	}

	public Tesis getTesisEditar() {
		return tesisEditar;
	}

	public void setTesisEditar(Tesis tesisEditar) {
		this.tesisEditar = tesisEditar;
	}

	public Tesis getTesisSeleccionado() {
		return tesisSeleccionado;
	}

	public void setTesisSeleccionado(Tesis tesisSeleccionado) {
		this.tesisSeleccionado = tesisSeleccionado;
	}

	public ExperienciaLaboral getExperienciaLabEditar() {
		return experienciaLabEditar;
	}

	public void setExperienciaLabEditar(ExperienciaLaboral experienciaLabEditar) {
		this.experienciaLabEditar = experienciaLabEditar;
	}

	public ExperienciaLaboral getExperienciaLabSeleccionado() {
		return experienciaLabSeleccionado;
	}

	public void setExperienciaLabSeleccionado(
			ExperienciaLaboral experienciaLabSeleccionado) {
		this.experienciaLabSeleccionado = experienciaLabSeleccionado;
	}

	public List<Empresa> getListEmpresas() {
		return listEmpresas;
	}

	public void setListEmpresas(List<Empresa> listEmpresas) {
		this.listEmpresas = listEmpresas;
	}

	public EmpresaService getEmpresaService() {
		return empresaService;
	}

	public void setEmpresaService(EmpresaService empresaService) {
		this.empresaService = empresaService;
	}

	public List<Certificado> getListCertificados() {
		return listCertificados;
	}

	public void setListCertificados(List<Certificado> listCertificados) {
		this.listCertificados = listCertificados;
	}

	public Usuario getUsuLogueado() {
		return usuLogueado;
	}

	public void setUsuLogueado(Usuario usuLogueado) {
		this.usuLogueado = usuLogueado;
	}

	public Egresado getEgresadoSeleccionado() {
		return egresadoSeleccionado;
	}

	public void setEgresadoSeleccionado(Egresado egresadoSeleccionado) {
		this.egresadoSeleccionado = egresadoSeleccionado;
	}

	public List<Egresado> getListEgresados() {
		return listEgresados;
	}

	public void setListEgresados(List<Egresado> listEgresados) {
		this.listEgresados = listEgresados;
	}

	public int getGradoTesis() {
		return gradoTesis;
	}

	public void setGradoTesis(int gradoTesis) {
		this.gradoTesis = gradoTesis;
	}

	public Empresa getEmpresa() {
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}
}
